package com.k2data.k2app.service;

import com.google.common.collect.Maps;
import com.k2data.k2app.common.MyConstant;
import com.k2data.k2app.domain.WarningRecord;
import com.k2data.k2app.util.DateFormatterUtil;
import com.k2data.k2app.util.redis.RedisUtils;
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;

/**
 * @Author cuilibo@k2data.com.cn
 * @Date 17-12-27 下午2:58.
 */
@Log4j
@Service
public class RedisService {
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private MyConstant myConstant;
    @Autowired
    private WarningRecordService warningRecordService;

    public void set(String key, Object value) {
        redisUtils.set(key, value);
    }

    public Map get(String key) {
        return redisUtils.get(key)==null? Maps.newHashMap():(Map)redisUtils.get(key);
    }

    public void updateRedisRecord(){
        System.out.println("check redis Data!");
        Map map = get("defaultSpaceRaw");
            // 时候有缓存记录
        if (map.size() > 0) {
            // 最后一次接数时间
            String ts = map.getOrDefault("ts", DateFormatterUtil.getNow()).toString();
            // 是否在接数标记： yes 正常接数  no  已经报故障
            String isNormal = map.getOrDefault("isNormal", "yes").toString();
            // 是否已经邮箱通知
            String isEmail = map.getOrDefault("isEmail", "no").toString();
            Date parse = null;
            try {
                parse = new SimpleDateFormat(DateFormatterUtil.timePattern).parse(ts);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            if ("yes".equals(isEmail)) {
                // 已经发送邮箱通知，不处理
            } else if ("no".equals(isNormal)) {
                // 没有发送邮箱，但是发送了站内通知
                // 判断需要不需要发送邮箱通知
                // 需要发送邮箱通知，则改变缓存中邮箱通知状态
                if (LocalDateTime.now().minusMinutes(Long.parseLong(myConstant.getSendEmailTime())).isAfter(DateFormatterUtil.UDateToLocalDateTime(parse))) {
                    map.put("isEmail", "yes");
                    set("defaultSpaceRaw", map);
                    // 发送邮箱通知
                    try {
                        // 插入一条报警记录
                        System.out.println(myConstant.getSendEmailTime()+"分钟没接到数据,发送邮箱通知");
                        WarningRecord warningRecord = new WarningRecord();
                        warningRecord.setLastAcceptTime(DateFormatterUtil.UDateToLocalDateTime(parse));
                        warningRecord.setWarningTime(LocalDateTime.now());
                        warningRecord.setDealType("mail");
                        warningRecord.setStatus("fault");
                        warningRecord.setServerName("发数服务");
                        warningRecord.setMessage(myConstant.getSendEmailTime()+"分钟没接到数据了");
                        warningRecordService.add(warningRecord);
                        // TODO 发送邮箱通知监控人

                    } catch (Exception e) {
                        log.error("send email error!");
                        e.printStackTrace();
                    }
                }
            }else {
                // 既然没有邮箱通知，也没有站内记录 判断时间间隔  是否超出了接数时间范围
                // 超过了时间范围
                if (LocalDateTime.now().minusMinutes(Long.parseLong(myConstant.getCron())).isAfter(DateFormatterUtil.UDateToLocalDateTime(parse))) {
                    // 修改缓存记录中：是否正常标记
                    map.put("isNormal", "no");
                    set("isNormal", map);
                    try {
                        // 插入一条报警记录
                        // ts1 最后接入时间， ts2 检测时间，
                        System.out.println(myConstant.getCron()+"分钟没接到数据,添加故障记录");
                        WarningRecord warningRecord = new WarningRecord();
                        warningRecord.setLastAcceptTime(DateFormatterUtil.UDateToLocalDateTime(parse));
                        warningRecord.setWarningTime(LocalDateTime.now());
                        warningRecord.setDealType("");
                        warningRecord.setStatus("fault");
                        warningRecord.setServerName("发数服务");
                        warningRecord.setMessage(myConstant.getCron()+"分钟没接到数据了");
                        warningRecordService.add(warningRecord);

                    } catch (Exception e) {
                        log.error("update device error!");
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
